#include "dht11.h"

void dht11_reset()
{
	DHT11_IO_OUT();
	DHT11_DATA=0;
	sys_delay_ms(20);
	DHT11_DATA=1;
	sys_delay_about_us(30);
}

#define RETRY_NUM		100
u8 dht11_check()
{
	u8 retry=0;
	DHT11_IO_IN();
	while(DHT11_DATA&&(retry<RETRY_NUM))
	{
		retry++;
		sys_delay_about_us(1);
	}
	if(retry==RETRY_NUM)
		return 1;
	while((!DHT11_DATA)&&(retry<RETRY_NUM))//???????
	{
		retry++;
		sys_delay_about_us(1);
	}
	if(retry==RETRY_NUM)
		return 2;
	return 0;
}

u8 dht11_init()
{
	dht11_reset();
	return dht11_check();
}

u8 dht11_read_bit()
{
	u8 retry=0;
	while(DHT11_DATA&&(retry<RETRY_NUM))
	{
		retry++;
		sys_delay_about_us(1);
	}
		while((!DHT11_DATA)&&(retry<RETRY_NUM))
	{
		retry++;
		sys_delay_about_us(1);
	}
	sys_delay_about_us(40);
	return DHT11_DATA;
}

u8 dht11_read_byte()
{
	u8 dat=0;
	u8 i;
	for(i=0;i<8;i++)
	{
		dat <<= 1;
		dat |=dht11_read_bit();
	}
	return dat;
}
u8 dht11_read_data(u8 * temp,u8 * hum)
{
	u8 i;
	u8 buf[5];
	dht11_reset();
	if(dht11_check()==0)
	{
		for(i=0;i<5;i++)
			buf[i]=dht11_read_byte();
		if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
		{
			*hum = buf[0];
			*temp = buf[2];
			return 0;
		}
	}
	return 1;
}



